<?php // $Id: do_install_db.php,v 1.26.2.9 2007/02/17 06:03:00 ajdonnison Exp $

include_once 'check_upgrade.php';
if ($_POST['mode'] == 'install' && dPcheckUpgrade() == 'upgrade') {
	require_once('security.php');
	exit();
}

######################################################################################################################

$baseDir = dirname(dirname(__FILE__));
define('DP_BASE_DIR', $baseDir);
$baseUrl = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? 'https://' : 'http://';
$baseUrl .= isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : getenv('HTTP_HOST');
$baseUrl .= isset($_SERVER['SCRIPT_NAME']) ? dirname(dirname($_SERVER['SCRIPT_NAME'])) : dirname(dirname(getenv('SCRIPT_NAME')));

require_once "$baseDir/install/install.inc.php";

$AppUI =& new InstallerUI; // Fake AppUI class to appease the db_connect utilities.

$dbMsg = "";
$cFileMsg = "Not Created";
$dbErr = false;
$cFileErr = false;

$dbtype = trim( dPInstallGetParam( $_POST, 'dbtype', 'mysql' ) );
$dbhost = trim( dPInstallGetParam( $_POST, 'dbhost', '' ) );
$dbname = trim( dPInstallGetParam( $_POST, 'dbname', '' ) );
$dbuser = trim( dPInstallGetParam( $_POST, 'dbuser', '' ) );
$dbpass = trim( dPInstallGetParam( $_POST, 'dbpass', '' ) );
$dbdrop = dPInstallGetParam( $_POST, 'dbdrop', false );
$mode = dPInstallGetParam( $_POST, 'mode', 'upgrade' );
$dbpersist = dPInstallGetParam( $_POST, 'dbpersist', false );
$do_db = isset($_POST['do_db']);
$do_db_cfg = isset($_POST['do_db_cfg']);
$do_cfg = isset($_POST['do_cfg']);

// Create a dPconfig array for dependent code
$dPconfig = array(
	'dbtype' => $dbtype,
	'dbhost' => $dbhost,
	'dbname' => $dbname,
	'dbpass' => $dbpass,
	'dbuser' => $dbuser,
	'dbpersist' => $dbpersist,
	'root_dir' => $baseDir,
	'base_url' => $baseUrl
);

// Version array for moving from version to version.
$versionPath = array(
	'1.0.2',
	'2.0-alpha',
	'2.0-beta',
	'2.0',
	'2.0.1',
	'2.0.2',
	'2.0.3',
	'2.0.4',
	'2.1-rc1',
);

global $lastDBUpdate;
$lastDBUpdate = '';

require_once( "$baseDir/lib/adodb/adodb.inc.php" );
@include_once "$baseDir/includes/version.php";

$db = NewADOConnection($dbtype);

$current_version = $dp_version_major . '.' . $dp_version_minor;
$current_version .= isset($dp_version_patch) ? ".$dp_version_patch" : '';
$current_version .= isset($dp_version_prepatch) ? "-$dp_version_prepatch" : '';
?>
<html>
<head>
	<title>Simple dotProject Installer</title>
	<meta name="Description" content="Simple dotProject Installer">
	<link rel="stylesheet" type="text/css" href="../style/default/main.css">
	<script src="install.js"></script>
</head>
<body onload="resize()" onresize="resize()">
<center>
<h1 id="idTitle"><img src="dp.png" align="middle" alt="Simple dotProject Logo"/>&nbsp;Simple dotProject Installer</h1>
<div id="idContents" style="overflow: auto; width: 100%" align="center">
<table cellspacing="0" cellpadding="3" border="0" class="list" width="750px" align="center">
<tr>
	<td class="item" colspan="2"><div style="float: left"><img src="dbsetup.gif">&nbsp;</div><div style="margin-left: 56px; padding: 8px">The Installer is currently importing data to your database &amp; creating configuration file for Simple dotProject System.  If any error orrcur please take your time to review your parameters and try to do this step again.</div>
	</td>
</tr>
</table>
<br/>
<table cellspacing="0" cellpadding="3" border="0" class="list" width="750px">
<tr class="title"><td><b>Progress:</b></td></tr>
<tr class="second"><td>
<?php

if(!empty($db)) {
	echo '<span class="error">';
	$dbc = $db->Connect($dbhost,$dbuser,$dbpass);
	echo '</span>';
	if ($dbc)
		$existing_db = $db->SelectDB($dbname);
} else {
	$dbc = false;
}
?>
<br/>

<?
if ($dbc && ($do_db || $do_db_cfg)) {

	if ($mode == 'install') {

		if ($dbdrop) { 
			dPmsg("Dropping previous database");
			$db->Execute("DROP DATABASE IF EXISTS ".$dbname); 
			$existing_db = false;
		}

		if (! $existing_db) {
			dPmsg("Creating new Database");
			$db->Execute("CREATE DATABASE ".$dbname);
			$dbError = $db->ErrorNo();

			if ($dbError <> 0 && $dbError <> 1007) {
				$dbErr = true;
				$dbMsg .= "A Database Error occurred. Database has not been created! The provided database details are probably not correct.<br>".$db->ErrorMsg()."<br>";

			}
		}
	}

	// For some reason a db->SelectDB call here doesn't work.
	$db->Execute('USE ' . $dbname);
	$db_version = InstallGetVersion($mode, $db);

	$code_updated = '';
	if ($mode == 'upgrade') {
		dPmsg("Applying database updates");
		$last_version = $db_version['code_version'];
		// Convert the code version to a version string.
		if ($last_version != $current_version) {
			// Check for from and to versions
			$from_key = array_search($last_version, $versionPath);
			$to_key = array_search($current_version, $versionPath);
			for ($i = $from_key; $i < $to_key; $i++) {
				$from_version = str_replace(array('.','-'), '', $versionPath[$i]);
				$to_version = str_replace(array('.','-'), '', $versionPath[$i+1]);
				// Only do updates since last update - this is only necessary if updating via CVS of a previous
				// version, but well worth doing anyway.
				InstallLoadSql("$baseDir/db/upgrade_{$from_version}_to_{$to_version}.sql", $db_version['last_db_update']);
				$db_version['last_db_update'] = $lastDBUpdate; // Global set by InstallLoadSql.
			}
		} else if (file_exists("$baseDir/db/upgrade_latest.sql")) {
			// Need to get the installed version again, as it should have been
			// updated by the from/to stuff.
			InstallLoadSql("$baseDir/db/upgrade_latest.sql", $db_version['last_db_update']);
		}
	} else {
		dPmsg("Installing database");
		InstallLoadSql("$baseDir/db/dotproject.sql");
		// After all the updates, find the new version information.
		$new_version = InstallGetVersion($mode, $db);
		$lastDBUpdate = $new_version['last_db_update'];
		$code_updated = $new_version['last_code_update'];
	}

	$dbError = $db->ErrorNo();
	if ($dbError <> 0 && $dbError <> 1007) {
		$dbErr = true;
		$dbMsg .= "A Database Error occurred. Database has probably not been populated completely!<br>".$db->ErrorMsg()."<br>";
	}
	if ($dbErr) {
		$dbMsg = "DB setup incomplete - the following errors occured:<br>".$dbMsg;
	} else {
		$dbMsg = "Database successfully setup<br>";
	}

	if ($mode == 'upgrade') {
		dPmsg("Applying data modifications");
		// Check for an upgrade script and run it if necessary.
		// Note we don't need to run individual version files any more
		if (file_exists("$baseDir/db/upgrade_latest.php")) {
			include_once "$baseDir/db/upgrade_latest.php";
			$code_updated = dPupgrade($db_version['code_version'], $current_version, $db_version['last_code_update']);
		} else {
			dPmsg("No data updates required");
		}
	} else {
		include_once "$baseDir/db/upgrade_permissions.php"; // Always required on install.
	}

	dPmsg("Updating version information");
	// No matter what occurs we should update the database version in the dpversion table.
	if (empty($lastDBUpdate)) {
		$lastDBUpdate = $code_updated;
	}
	$sql = "UPDATE dpversion
		SET db_version = '$dp_version_major',
		last_db_update = '$lastDBUpdate',
		code_version = '$current_version',
		last_code_update = '$code_updated'
		WHERE 1";
	$db->Execute($sql);

} else {
	$dbMsg = "Not Created";
	if (! $dbc) {
		$dbErr=1;
		$dbMsg .= "<br/>No Database Connection available! "  . ($db ? $db->ErrorMsg() : '');
	}
}

// always create the config file content

dPmsg("Creating config");
$config = "<?php \n";
$config .= "### Copyright (c) 2004, The dotProject Development Team dotproject.net and sf.net/projects/dotproject ###\n";
$config .= "### All rights reserved. Released under GPL License. For further Information see LICENSE ###\n";
$config .= "\n";
$config .= "### CONFIGURATION FILE AUTOMATICALLY GENERATED BY THE DOTPROJECT INSTALLER ###\n";
$config .= "### FOR INFORMATION ON MANUAL CONFIGURATION AND FOR DOCUMENTATION SEE ./includes/config-dist.php ###\n";
$config .= "\n";
$config .= "\$dPconfig['dbtype'] = '$dbtype';\n";
$config .= "\$dPconfig['dbhost'] = '$dbhost';\n";
$config .= "\$dPconfig['dbname'] = '$dbname';\n";
$config .= "\$dPconfig['dbuser'] = '$dbuser';\n";
$config .= "\$dPconfig['dbpass'] = '$dbpass';\n";
$config .= "\$dPconfig['dbpersist'] = " . ($dbpersist ? 'true' : 'false') . ";\n";
$config .= "\$dPconfig['root_dir'] = \$baseDir;\n";
$config .= "\$dPconfig['base_url'] = \$baseUrl;\n";
$config .= "?>";
$config = trim($config);

if ($do_cfg || $do_db_cfg){
	if ((is_writable("../includes/config.php")  || ! is_file("../includes/config.php")) &&
		($fp = fopen("../includes/config.php", "w"))) {
		fputs( $fp, $config, strlen( $config ) );
		fclose( $fp );
		$cFileMsg = "Configuration file written successfully\n";
	} else {
		$cFileErr = true;
		$cFileMsg = "Configuration file could not be written\n";
	}
}

//echo $msg;
?>
</td></tr>
</table>
<br/>
<table cellspacing="0" cellpadding="3" border="0" class="list" width="750px" align="center">
<tr>
	<td colspan="2"><b>Results</b></td>
</tr>
<tr class="second">
	<td class="title" width="200px">Database Installation Feedback:</td>
	<td class="item">
		<b style="color:<?=$dbErr ? 'red' : 'green'?>"><?=$dbMsg?></b>
		<? if ($dbErr) { ?> <br />
		Please note that errors relating to dropping indexes during upgrades are <b>NORMAL</b> and do not indicate a problem.
		<? } ?>
	</td>
<tr>
<tr class="second">
	<td class="title" width="200px">Configuration File Creation Feedback:</td>
	<td class="item" align="left">
		<b style="color:<?=$cFileErr ? 'red' : 'green'?>"> <?=$cFileMsg?></b>
	</td>
</tr>
<? if(($do_cfg || $do_db_cfg) && $cFileErr) { ?>
<tr>
	<td class="item" align="left" colspan="2">The following Content should go to ./includes/config.php. Create that text file manually and copy the following lines in by hand. Delete all empty lines and empty spaces after and save. This file should be readable by the webserver.</td>
</tr>
<tr>
	<td align="center" colspan="2"><textarea class="button" name="dbhost" cols="100" rows="20" title="Content of config.php for manual creation." /><?=$msg.$config?></textarea></td>
</tr>
<? } ?>
<? if ($mode == 'install') { ?>
<tr>
	<td class="help" align="center" colspan="2" style="padding: 8px"><p>The Administrator login has been set to <b>admin</b> with a password of <b>passwd</b>.<br/>It is a good idea to change this password when you first log in</p></td>
</tr>
<? } ?>
<tr>
<?
	$c = $baseUrl[strlen($baseUrl)-1];
	if ($c == '/' || $c == '\\') $baseUrl = substr($baseUrl, 0, strlen($baseUrl) - 1);
?>
	<td class="item" align="center" colspan="2" style="padding: 16px">
		<a class="button" href="<?=$baseUrl.'/index.php?m=system&a=systemconfig'?>">Login and Configure the Simple dotProject System Environment</a>
	</td>
</tr>
</table>
<br/>
</body>
</center>
</html>
